package com.example.loginpilot_01.service.file;

import com.example.loginpilot_01.entity.FileInfo;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class FileService {

    private final FileInfoRepository fileInfoRepository;

    // 构造方法注入
    public FileService(FileInfoRepository fileInfoRepository) {
        this.fileInfoRepository = fileInfoRepository;
    }

    // 文件存储路径（建议放在项目外，避免重启项目丢失，这里先演示项目内路径）
    private static final String UPLOAD_DIR = System.getProperty("user.dir") + "/src/main/resources/static/upload/";

    // 1. 上传文件
    public FileInfo uploadFile(MultipartFile file, String uploader) throws IOException {
        // 1. 创建上传目录（不存在则创建）
        File uploadDir = new File(UPLOAD_DIR);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }

        // 2. 处理文件名（避免重复，用UUID+原始文件名）
        String originalFileName = file.getOriginalFilename();
        String fileSuffix = originalFileName.substring(originalFileName.lastIndexOf("."));
        String newFileName = UUID.randomUUID() + fileSuffix;

        // 3. 保存文件到本地
        File destFile = new File(UPLOAD_DIR + newFileName);
        file.transferTo(destFile);

        // 4. 封装文件信息到数据库
        FileInfo fileInfo = new FileInfo();
        fileInfo.setFileName(originalFileName); // 原始文件名
        fileInfo.setFileUrl("/upload/" + newFileName); // 访问URL（前端通过这个路径下载）
        fileInfo.setFileSize(formatFileSize(file.getSize())); // 文件大小（格式化：如1MB）
        fileInfo.setFileType(fileSuffix.substring(1)); // 文件类型（去掉.，如docx）
        fileInfo.setUploader(uploader); // 上传人（管理员用户名）
        fileInfo.setUploadTime(new Date()); // 上传时间

        // 5. 保存到数据库
        return fileInfoRepository.save(fileInfo);
    }

    // 2. 格式化文件大小（B→KB→MB）
    private String formatFileSize(long size) {
        if (size < 1024) {
            return size + "B";
        } else if (size < 1024 * 1024) {
            return String.format("%.1fKB", size / 1024.0);
        } else {
            return String.format("%.1fMB", size / (1024.0 * 1024.0));
        }
    }

    // 3. 查询所有文件（按上传时间倒序）
    public List<FileInfo> getAllFiles() {
        return fileInfoRepository.findAllByOrderByUploadTimeDesc();
    }

    // 4. 删除文件（根据ID：先删本地文件，再删数据库记录）
    public void deleteFile(Integer id) throws IOException {
        FileInfo fileInfo = fileInfoRepository.findById(id).orElse(null);
        if (fileInfo != null) {
            // 删本地文件
            File file = new File(UPLOAD_DIR + fileInfo.getFileUrl().substring("/upload/".length()));
            if (file.exists()) {
                file.delete();
            }
            // 删数据库记录
            fileInfoRepository.deleteById(id);
        }
    }

    // 5. 根据ID查询文件（用于下载/查看详情）
    public FileInfo getFileById(Integer id) {
        return fileInfoRepository.findById(id).orElse(null);
    }
}